package com.shujia.day12;

import java.util.ArrayList;

public class Code01Demo {
    public static void main(String[] args) {
        /*
            泛型：
                之前在做ArrayList数据添加时，对于add方法，可以添加一个Object的子类，但是对于Java来说，静态类型语言，
                    对于每一个数据要求有固定的数据类型,那么对于ArrayList中通过add方法可以添加不同类型数据，
                    但是实际上添加的都是Object的子类，取数据时，必须要求其类型为 Object,如果给定一个特定的子类，那么会报错
                 所以由此可以知道，集合在一开始设计时，只能存储同一种数据类型，但是怎么样通过一种规范来限定 集合存储同一种类型
                    可以使用泛型

                格式：在类的旁边添加一个 <> 用来表示一个泛型，泛型中需要给定一个指定的类名称，
                        当给定泛型时，其泛型在源码中对应位置的类型都会发生变化  如果泛型不给的情况下，默认时Object
                        对于基本数据类型名称不能作为泛型的参数传入，可以传入其包装类


                     定义类时，如果要给定泛型，那么可以在类旁边使用 <变量名> 变量名的规范：一个大写的英文字母 通常使用 E / T 来代替
                             在定义类时对T进行调用，需要注意对于类型明确的函数不能将t作为参数进行传递

                作用：
                    对于一个集合来说，如果限定了其泛型，那么在调用其方法时，如果传入的参数和泛型不同，那么会在编译期报错


                好处：
                    1.限定了集合存储的数据类型，对后续的调用明确了
                    2.不需要再向下进行转型了
                    3.消除了大量的黄色警告


         */
//        ArrayList arrayList = new ArrayList();
//
//        arrayList.add("123");
//        arrayList.add(12);
//
//        for (Object o : arrayList) {
//
//        }



        ArrayList<String> strArr = new ArrayList<>();

        strArr.add("123");
//        strArr.add(123);

        strArr.add("456");
        System.out.println(strArr);  // 直接打印ArrayList => 重写了toString 方法

//        new ArrayList<int>();  不可以
        ArrayList<Integer> intArr = new ArrayList<>();

        intArr.add(123);
        intArr.add(456);

        System.out.println(intArr);




        // 自定义类

        ArrayList<Student> stuArr = new ArrayList<>();

        stuArr.add(new Student("杨浩",20));
        stuArr.add(new Student("罗中文",18));

        System.out.println(stuArr);


        for (Student student : stuArr) {
            System.out.println(student);
        }

    }
}
